package br.com.positrot.controller.managedbean;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;

import br.com.positrot.controller.managedbean.AbstractMB.StatusEnum;
import br.com.positrot.controller.util.FacesUtil;
import br.com.positrot.form.FormUtil;
import br.com.positrot.form.exception.FormNaoImplementadoException;
import br.com.positrot.model.bo.BOImplentation;
import br.com.positrot.model.bo.BOInterface;
import br.com.positrot.model.log.Form;
import br.com.positrot.model.vo.PermissaoVO;
import br.com.positrot.model.vo.PersistivelPrincipal;
import br.com.positrot.model.vo.PermissaoVO.TipoPermissao;

public class PesquisaOrfaosMB implements AcessoRestrito {

	private String paginaDeNavegacao = "pesquisaOrfaos";
	
	private Pesquisa pesquisa = null;
	
	private Integer qtdeRegistros = 10;
		
	private int codFormSelecionado;
	
	//private Boolean renderizarResultados = false;
	
	public PesquisaOrfaosMB(){
		
		super();
		
		MenuPrincipalMB sessionMenu = (MenuPrincipalMB) FacesUtil.getBean("#{menuPrincipalMB}");
	   	
    	if (sessionMenu != null && sessionMenu.getUsuarioLogado() != null){
    		    		   	
	    	boolean acessoPermitido = sessionMenu.acessoPermitido(this);
	   		
        	if (!acessoPermitido){
	    		
    			setPaginaDeNavegacao(AcessoRestrito.PAGINA_ACESSO_NAO_PERMITIDO);
    			
    			try {
					FacesUtil.getResponse().sendRedirect("acessoNaoPermitido.xhtml");
				} catch (IOException e) {					
					FacesUtil.addMensagemErro(e.getMessage());
				}
	    		
	    	}else{
	    		
	    		this.setPesquisa(sessionMenu.getPesquisa());
				
				if (this.getPesquisa() != null){
					this.setCodFormSelecionado(this.getPesquisa().getForm().getIdForm() );
				}
    			
	    	}
	    	
	    	
    	}
    	

	}
	
	@Override
	public List<TipoPermissao> getTiposPermissaoAcesso(StatusEnum status) {
		
		List<PermissaoVO.TipoPermissao> listPerm = new ArrayList<PermissaoVO.TipoPermissao>();
		
		listPerm.add(TipoPermissao.LEITURA);
		listPerm.add(TipoPermissao.ALTERACAO);
		
		return listPerm;
		
	}
	
	public String pesquisarOrfaos_action(){
		
			
		Form formSelecionado = FormUtil.getForms().get(this.codFormSelecionado);
		
		this.getPesquisa().setForm(formSelecionado);
		
		if (formSelecionado.equals(FormUtil.FormsEnum.NA.getForm())){
			
			BOInterface bo = new BOImplentation();
												
			this.getPesquisa().setResultadoPersPrincipal( bo.obterTodosFormsOrfaos() );
						
		}else{
			
			BOInterface bo;
			Class<? extends PersistivelPrincipal> classe;
			
			try {

				bo = FormUtil.obterItemEnum(formSelecionado).obterBO();
				classe = FormUtil.obterItemEnum(formSelecionado).obterClassePersistivelPrincipal();
				
			} catch (FormNaoImplementadoException e) {
				
				FacesUtil.addMensagemErro(e.getMessage());
				return null;
				
			}
						
			this.getPesquisa().setResultadoPersPrincipal( bo.obterFormsOrfaos(classe) );
									
		}
				
		
		this.getPesquisa().setTotal(pesquisa.getResultadoPersPrincipal().size());
		this.getPesquisa().setRenderizarForm(true);
		
		return null;
		
	}

	public Integer getQtdeRegistros() {
		return qtdeRegistros;
	}

	public void setQtdeRegistros(Integer qtdeRegistros) {
		this.qtdeRegistros = qtdeRegistros;
	}

	

	
	public int getCodFormSelecionado() {
		return codFormSelecionado;
	}

	public void setCodFormSelecionado(int codFormSelecionado) {
		this.codFormSelecionado = codFormSelecionado;
	}

	public SelectItem[] getForms(){
		return FacesUtil.getFormsItems();
	}
	
	
	

	public Pesquisa getPesquisa() {
		return pesquisa;
	}

	public void setPesquisa(Pesquisa pesquisa) {
		this.pesquisa = pesquisa;
	}

	public String limparForm_action(){

		this.setPesquisa(new Pesquisa());
		this.setCodFormSelecionado(0);

		this.getPesquisa().setRenderizarForm(false);

		return null;

	}
	
	public String getPaginaDeNavegacao() {
		return paginaDeNavegacao;
	}

	public void setPaginaDeNavegacao(String paginaDeNavegacao) {
		this.paginaDeNavegacao = paginaDeNavegacao;
	}
	
		
	public String ver_action(){
		
		String retorno = "";		
	
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
		
		MenuPrincipalMB sessionMenu = ((MenuPrincipalMB)FacesUtil.getBean("#{menuPrincipalMB}"));
		sessionMenu.setAcao(StatusEnum.CONSULTA_ORFAO);
		sessionMenu.setResumo(null);
		sessionMenu.setPesquisa(this.getPesquisa());	
		
		PersistivelPrincipal objSelecionado = (PersistivelPrincipal)request.getAttribute("record"); 
		//Item de Enum para armazenar o tipo referente ao form selecionado
		FormUtil.FormsEnum itemEnum = objSelecionado.getForm();
					
		AbstractMB bean = itemEnum.obterMB();
			
		bean.setPersistivelPrincipal(itemEnum.obterBO().obterPrimDigitacao(objSelecionado));
		
		sessionMenu.setBeanDeRequisicao( bean );
		
		retorno = sessionMenu.getBeanDeRequisicao().getPaginaDeNavegacao();
				
		return retorno;
	
	}

}
